package routers

import (
	"gameserver/messages"
	"gameserver/server/Login/internal"

	"gitee.com/night-tc/gobige/common"
)

/*
所有用户的db操作
*/

// 获取账号数据 条件 openid
func getUserByOpenID(openID, channelid string) (result *messages.Account_MD, err error) {
	err = internal.GetSrvinst().GetMysqlMgr().Where("open_id = ? AND channel_id = ?", openID, channelid).First(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// 创建并返回账号数据
func CreateUserByOpenID(openID, channelid string) (result *messages.Account_MD, err error) {
	result = &messages.Account_MD{OpenID: openID, ChannelID: channelid}
	err = internal.GetSrvinst().GetMysqlMgr().
		FirstOrCreate(result, "open_id = ? AND channel_id = ?", openID, channelid).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// 获取账号的角色数据
func getPlayerByUserID(userID uint64) (result []*messages.Player_MD, err error) {
	err = internal.GetSrvinst().GetMysqlMgr().Where("user_id = ?", userID).Find(&result).Error
	return
}

// 创建并返回账号的角色数据
func CreatePlayerByUserID(userID, groupid uint64, name string) (result *messages.Player_MD, err error) {
	result = &messages.Player_MD{UserID: userID, GroupID: groupid, PlayerName: name}
	err = internal.GetSrvinst().GetMysqlMgr().
		Create(result).Error
	// 如果一个用户在一个groupid下只能有一个角色，可以使用FirstOrCreate
	// FirstOrCreate(result, "user_id = ? AND group_id = ?", userID, groupid).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// 更新角色名字
func UpPlayerName(playerID uint64, name string) (err error) {
	result := &messages.Player_MD{PlayerID: playerID, PlayerName: name}
	//因为使用了主键，所有不要使用Where了，不然会有二个playerid的记录
	err = internal.GetSrvinst().GetMysqlMgr().Model(result).Select("player_name").Updates(result).Error
	if err != nil {
		return err
	}
	return nil
}

// 修改角色的扩展数据
func UpPlayerExData(playerID uint64, exdata []byte) (err error) {
	result := &messages.Player_MD{PlayerID: playerID, ExData: exdata}
	err = internal.GetSrvinst().GetMysqlMgr().Model(result).Select("ex_data").Updates(result).Error
	if err != nil {
		return err
	}
	return nil
}

// 检查名字是否被使用过
func CheckNames(names []string) []string {
	// 未使用的名字列表
	var unusedNames []string

	// 已存在的名字列表
	var existingNames []string

	// 查询数据库中已存在的名字
	err := internal.GetSrvinst().GetMysqlMgr().
		Model(&messages.Player_MD{}).
		Where("player_name IN ? ", names).
		Pluck("player_name", &existingNames).Error
	if err != nil {
		// 如果查询出错，直接返回空列表
		return unusedNames
	}
	for _, name := range names {
		if common.ArrayIndexof(existingNames, name) == -1 {
			unusedNames = append(unusedNames, name)
		}
	}
	return unusedNames
}

// 获取角色数据
func getPlayer(playerID uint64) (result *messages.Player_MD, err error) {
	err = internal.GetSrvinst().GetMysqlMgr().Where("player_id = ?", playerID).First(&result).Error
	return
}

// 获取账号数据
func getUser(userid uint64) (result *messages.Account_MD, err error) {
	err = internal.GetSrvinst().GetMysqlMgr().Where("user_id = ?", userid).First(&result).Error
	return
}
